# SSN - input
# Copyright (c) 2009, jonoerik
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
# conditions are met:
#
#    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following
#	disclaimer.
#    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
#	disclaimer in the documentation and/or other materials provided with the distribution.
#    * The names of contributors may not be used to endorse or promote products derived from this software without specific
#	prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

#input
#handles all keyboard based input for ssn

#library imports
from sys import path as syspath
syspath.append('.//libtcod-1.4.1')
import libtcodpy as libtcod
import numpy

import game
from util import *

def handle_input(g):
    kbd = libtcod.console_check_for_keypress(libtcod.KEY_PRESSED | libtcod.KEY_RELEASED)
    
    if get_key_status(g, 0, kbd, 'quit'):
        g.running = False

    if get_key_status(g, 0, kbd, 'toggle fps'):
        g.show_fps = not g.show_fps
    if get_key_status(g, 0, kbd, 'regenerate map'):
        g.load_area('building')
    if get_key_status(g, 0, kbd, 'take screenshot'):
        libtcod.sys_save_screenshot()

    if get_key_status(g, 1, kbd, 'sprint'):
        g.actors.actor_pc.speed_is_sprinting = True
    else:
        g.actors.actor_pc.speed_is_sprinting = False

    disp_x = int(get_key_status(g, 1, kbd, 'right')) - int(get_key_status(g, 1, kbd, 'left'))
    disp_y = int(get_key_status(g, 1, kbd, 'down')) - int(get_key_status(g, 1, kbd, 'up'))
    g.actors.move_pc(g, (disp_x, disp_y))

def get_key_status(g, type, kbd, action):
    '''returns the status of a key corresponding to a specific action
    action - key relations are found in g.key_bindings
    type == 0: has the key been pressed
    type == 1: is the key held down (only for non KEY_CHAR keys)'''
    if type == 0:
        if kbd.vk == g.key_bindings[action][0]:
            #the next if statement takes advantace of the fact that
            #python lazy evaluation will only calculate the ord() if kbd.vk == libtcod.KEY_CHAR
            #this ensures that ord wont raise an error if passed None instead of a string, as with the special key assignments
            if kbd.vk != libtcod.KEY_CHAR or kbd.c == ord(g.key_bindings[action][1]):
                if kbd.pressed == 1:
                    return True
    elif type == 1:
        if libtcod.console_is_key_pressed(g.key_bindings[action][0]):
            return True
        
    #if key test failed
    #this will only be reached if other return statements aren't called
    return False